package org.resort.service;

import org.resort.entity.*;

import java.util.List;
import java.util.logging.Level;

/**
 * @Author 郭文虎
 * <p>
 * 超级管理员服务
 */
public interface SuperService {
    /**
     * 获取所有权限
     *
     * @return 所有权限集合
     */
    List<Privilege> getAllPrivilege();

    /**
     * 获取所有权限数量
     *
     * @return 所有权限数量
     */
    int countAllPrivilege();

    /**
     * 根据分页获取部分权限
     *
     * @param offset 偏移量
     * @param limit  每页显示条数
     * @return 分页的权限
     */
    List<Privilege> getPartPrivilegeByPage(int offset, int limit);

    /**
     * 根据编号获取一个Privilege对象
     *
     * @param id 编号
     * @return Privilege对象
     */
    Privilege getOnePrivilege(int id);

    /**
     * 根据编号修改Privilege
     *
     * @param id     编号
     * @param name   名称
     * @param href   跳转路径
     * @param icon   图标
     * @param parent 父权限
     * @return 受影响行数
     */
    int changeOnePrivilegeById(int id, String name, String href, String icon, String parent);

    /**
     * 添加一条Privilege数据
     *
     * @param name   名称
     * @param href   跳转路径
     * @param icon   图标
     * @param parent 父权限
     * @return 受影响行数
     */
    int addPrivilege(String name, String href, String icon, String parent);

    /**
     * 根据编号删除一条权限数据
     *
     * @param id 将要删除的权限编号
     * @return 受影响行数
     */
    int delPrivilegeById(int id);

    /**
     * 获取全部父权限
     *
     * @return 父权限集合
     */
    List<Privilege> getAllParentPrivilege();

    /**
     * 根据父权限分页获取子权限及当前父权限
     *
     * @param offset   偏移量
     * @param limit    每页显示条数
     * @param parentId 父权限编号
     * @return 对应的子权限和当前父权限
     */
    List<Privilege> getPartPrivilegeByPageAndParentId(int offset, int limit, int parentId);

    /**
     * 根据父权限编号统计有多少条对应的子权限(包括当前父权限)
     *
     * @param parentId 父权限编号
     * @return 满足条件的总条数
     */
    int countPartPrivilegeByParentId(int parentId);

    /**
     * 获取所有Role
     *
     * @return 所有Role集合
     */
    List<Role> getAllRole();

    /**
     * 统计所有Role的数量
     *
     * @return 所有Role的数量
     */
    int countAllRole();

    /**
     * 分页获取所有Role不包括RolePrivilege集合
     * @param offset 偏移量
     * @param limit 每页显示条数
     * @return 满足分页条件的Role集合
     */
    /*List<Role> getPartTotalRoleByPage(int offset, int limit);*/

    /**
     * 分页获取所有Role
     *
     * @param offset 偏移量
     * @param limit  每页显示条数
     * @return 满足分页条件的Role集合
     */
    List<Role> getPartRoleByPage(int offset, int limit);

    /**
     * 根据角色编号获取对应的权限
     *
     * @param roleId 角色编号
     * @return 对应的权限集合
     */
    List<Privilege> getPrivilegeByRoleId(int roleId);

    /**
     * 获取某角色所未拥有的权限
     *
     * @param roleId 角色编号
     * @return 这个角色未拥有的权限集合
     */
    List<Privilege> getPartPrivilegeNotRoleId(int roleId);

    /**
     * 移除这名角色当前所拥有的一个权限
     *
     * @param roleId      当前角色编号
     * @param privilegeId 将要移除的权限编号
     * @param level       权限等级(parent,children)
     * @return 受影响行数
     */
    int removePrivilege(int roleId, int privilegeId, String level);

    /**
     * 将父权限和对应的子权限一并分配给当前角色
     *
     * @param privilegeId 父权限编号
     * @param roleId      当前角色编号
     * @param level       等级(parent,children)
     * @return 分配权限数量(受影响行数)
     */
    int appendPrivilege(int privilegeId, int roleId, String level);

    /**
     * 获取所有内部部门信息
     *
     * @return 所有内部部门信息
     */
    List<InDepartment> getAllInDepartment();

    /**
     * 添加一条内部部门信息
     *
     * @param inDepartment 内部部门对象
     * @return 受影响行数
     */
    int addOneInDepartment(InDepartment inDepartment);

    /**
     * 修改一个内部部门
     *
     * @param inDepartment 内部部门对象
     * @return 受影响行数
     */
    int changeOneInDepartment(InDepartment inDepartment);

    /**
     * 根据编号查询内部部门信息
     *
     * @param inDepartmentId 编号
     * @return 内部部门对象
     */
    InDepartment getOneInDepartmentById(int inDepartmentId);

    /**
     * 根据编号删除一个内部部门
     *
     * @param inDepartmentId 内部部门编号
     * @return 受影响行数
     */
    int delInDepartmentById(int inDepartmentId);

    /**
     * 获取所有的外部部门信息
     *
     * @return 所有的外部部门信息
     */
    List<OutDepartment> getAllOutDepartment();

    /**
     * 根据编号删除外部部门
     *
     * @param outDepartmentId 将要删除的外部部门的编号
     * @return 受影响行数
     */
    int delOutDepartmentById(int outDepartmentId);

    /**
     * 获取所有会员状态
     *
     * @return 所有会员状态集合
     */
    List<State> getAllMemberState();

    /**
     * 获取所有会员等级
     *
     * @return 所有会员等级集合
     */
    List<MemberLevel> getAllMemberLevel();

    /**
     * 多条件分页查询会员
     *
     * @param stateId 状态编号
     * @param levelId 等级编号
     * @param name    会员姓名
     * @param offset  偏移量
     * @param limit   第页显示条数
     * @return 满足条件的会员集合
     */
    List<Member> getMemberByCondition(int stateId, int levelId, String name, int offset, int limit);

    /**
     * 根据条件获取会员总条数
     *
     * @param stateId 状态编号
     * @param levelId 等级编号
     * @param name    会员姓名
     * @return 总条数
     */
    int countMemberByCondition(int stateId, int levelId, String name);

    /**
     * 添加一名会员
     *
     * @param member 将要添加的会员对象
     * @return 受影响行数
     */
    int addOneMember(Member member);

    /**
     * 根据编号查询一名Member对象
     *
     * @param memberId 将要查询的会员的编号
     * @return 会员对象
     */
    Member getOneMemberById(int memberId);

    /**
     * 修改会员信息
     *
     * @param id           编号
     * @param name         姓名
     * @param identitycard 身份证号
     * @param account      账号
     * @param balance      余额
     * @param phone        手机号码
     * @param memberlevel  会员等级
     * @param state        状态
     * @return 受影响行数
     */
    int updateMember(int id, String name, String identitycard, String account, double balance, String phone, int memberlevel, int state);

    /**
     * 根据编号删除一条会员等级
     *
     * @param memberLevelId 将要删除的会员等级编号
     * @return 受影响行数
     */
    int delOneMemberLevel(int memberLevelId);

    /**
     * 根据编号获取会员等级对象
     *
     * @param memberLevelId 会员等级编号
     * @return 会员等级对象
     */
    MemberLevel getOneMemberLevelById(int memberLevelId);

    /**
     * 提交添加会员等级
     *
     * @param memberLevel 将要添加的会员等级对象
     * @return 受影响行数
     */
    int submitAddMemberLevel(MemberLevel memberLevel);

    /**
     * 提交修改会员等级
     *
     * @param memberLevel 将要修改的会员等级对象
     * @return 受影响行数
     */
    int submitChangeMemberLevel(MemberLevel memberLevel);
}
